iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0

現在要讓資料可以長期保留在APP裡

簡介

在Android中,比較主要的保留資料方式就是SQL,但因為架構原因,跟真正的SQL使用有很大的差異
在Android中,使用的Room,需要先建立資料型態、表、interafce、repo等過程

配置

Room的使用比較複雜,他需要一個plugin來輔助編譯這個庫

  • 確認Kotlin版本
    從libs.version.toml那邊查看,我這邊使用的是2.0.21
  • 在plugin添加ksp庫
    在build.grdle.kts(Module:App)裡面的plugin
plugins {  
    alias(libs.plugins.android.application)  
    alias(libs.plugins.kotlin.android)  
    alias(libs.plugins.kotlin.compose)  
    id("com.google.devtools.ksp")  
}

在build.grdle.kts(Project: Tutorial2025)裡面的plugin,其中2.0.21要填入使用的Kotlin版本

id("com.google.devtools.ksp") version "2.0.21-1.0.27" apply false

之後要先Sync一次

  • 添加dependency
val room_version = "2.8.1"  
ksp("androidx.room:room-compiler:$room_version")  
annotationProcessor("androidx.room:room-compiler:$room_version")  
implementation("androidx.room:room-ktx:$room_version")  
implementation("androidx.room:room-runtime:$room_version")

這樣Room就裝好了

在這邊補充一些添加依賴的方式,現在會有內建libs.version.toml來統一管理插件的版本與來源,在dependency底下的都是此類宣告,但也可以直接使用變數搭配字串的方式使用(絕對不是因為我只會這種)

架構

我第一次用的時候也是覺得太複雜了,所以這邊會停留比較久
先講解Room DB與viewmodel的需要部件

  • 儲存資料:DB schema,數據的架構
  • 操作方式:@DAO是一個interface後面會直接叫DAO
  • 構建資料庫:類似Create,可以一次操作多張表
  • (可選)型別轉換:由於部分型別可能不是和直接存入資料庫,所以可以定義轉換方式
  • ViewModelFactory:我也不太清楚用處,可以將viewmodel和database接在一起

可進行操作及優缺點

其實Room跟SQL幾乎一樣(有的操作),但Room明顯比SQL複雜了不只一個層級
雖然說這邊不會用得那麼複雜(我也沒用過),但還是介紹一下有的功能

  • 關聯式查詢(easy):直接在DAO裡面使用Join語法
  • 關聯式查詢(hard):使用relation或是中介表
data class UserWithOrders( // relation(1->n)
    @Embedded val user: User,
    @Relation(
        parentColumn = "userId",
        entityColumn = "userOwnerId"
    )
    val orders: List<Order>
)
@Entity(primaryKeys = ["studentId", "courseId"]) //中介(n->n)
data class StudentCourseCrossRef(
    val studentId: Int,
    val courseId: Int
)
  • Transaction:多表保持一致
    或許還有一些功能,但我了解的沒那麼深入

Pros

  • 安全:防SQL injection
  • 原生語法:非常接近Kotlin的語法結構
Cons
  • 複雜:在多表的時候程式的複雜度就突破天際了
  • 多限制:在操作資料庫的部分都是透過固定介面操作
  • 資料結構複雜:在不少時候需要存的資料跟在viewmodel中使用的資料不是一樣的,就需要額外定義

對於Room的使用,我覺得真的不用學那麼複雜,又沒有要拿手機當作伺服器用
其實只要懂架構,簡單的資料庫還是很簡單的


上一篇
Day 20:從網路獲取資料
系列文
現代Android jetpack compose開發入門21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言